package com.atguigu.educenter.controller;


import com.atguigu.commonutils.CommentVO.UcenterMemberComment;
import com.atguigu.commonutils.JwtUtils;
import com.atguigu.commonutils.OrderVO.UcenterMemberOrder;
import com.atguigu.commonutils.R;
import com.atguigu.educenter.entity.UcenterMember;
import com.atguigu.educenter.entity.vo.RegisterVo;
import com.atguigu.educenter.service.UcenterMemberService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * <p>
 * 会员表 前端控制器
 * </p>
 *
 * @author JavaPorject
 * @since 2022-04-17
 */
@RestController
@RequestMapping("/educenter/member")
// @CrossOrigin
public class UcenterMemberController {

    // 先注入
    @Autowired
    private UcenterMemberService memberService;

    // 实现登录功能
    // 注意 登录所使用的RequestBody对应的要加Post注解
    @PostMapping("login")
    public R loginUser(@RequestBody UcenterMember member) {
        // member对象封装手机号和密码
        // 调用service方法实现登录
        // 返回token值，使用jwt生成
        // 注意：由于我们使用了JDK11的版本 原有提供的jwt工具类已经不适用了
        // 我们要在该模块中引入高版本的jwt工具类
        String token = memberService.login(member);
        return R.ok().data("token",token);
    }
    // 实现注册功能
    // 创建一个专门的注册类，用于封装注册信息
    @PostMapping("register")
    public R registerUser(@RequestBody RegisterVo registerVo) {
        memberService.register(registerVo);
        return R.ok();
    }

    // 根据token获取用户信息
    // 我们上面登陆的方法返回了一个token值
    @GetMapping("getMemberInfo")
    public R getMemberInfo(HttpServletRequest request) {
        // 调用jwt工具类的方法。根据request对象获取头信息，返回用户id
        String memberId = JwtUtils.getMemberIdByJwtToken(request);
        // 查询数据库根据用户id获取用户信息
        UcenterMember member = memberService.getById(memberId);
        // 这里有个问题 我们没有建立专门的VO类来封装用户信息
        // 这样会导致我们返回到了一些敏感信息到前端页面
        // 例如密码，所以我们可以将这些值进行改变或者加密
        member.setPassword(null);
        return R.ok().data("userInfo",member);
    }


    // TODO 评论模块
    @ApiOperation("根据用户id获取用户信息-评论模块")
    @PostMapping("getUserInfoComment/{memberId}")
    public UcenterMemberComment getUserInfoComment(@PathVariable("memberId") String memberId){
        System.out.println("成功使用代理");
        UcenterMember member = memberService.getById(memberId);
        UcenterMemberComment ucenterMemberComment = new UcenterMemberComment();
        BeanUtils.copyProperties(member,ucenterMemberComment);
        return ucenterMemberComment;
    }


    /**
     * 用于被订单模块所调用的一些Controller
     * 1 根据用户Id获取到用户的信息 实际上就是调用service里面的方法即可
     */

    // 这里的方法相较于其它方法有所不同 我们一般使用专用的对象在后端实现模块之间传递
    // 这是因为在不同的微服务之间 调用方是没有被调用方的实体类的，所以无法返回原来的对象
    // 我们需要在Common模块中创建专用对象实现
    // 我们没有使用UcenterMember对象 而是在Common中创建专有UcenterMemberOrder来实现获得数据
    @PostMapping("getUserInfoOrder/{id}")
    public UcenterMemberOrder getUserInfoOrder(@PathVariable String id) {

        // 查询数据库根据用户id获取用户信息
        UcenterMember member = memberService.getById(id);
        // 创建专用对象
        UcenterMemberOrder memberOrder = new UcenterMemberOrder();
        BeanUtils.copyProperties(member, memberOrder);

        return memberOrder;
    }

    /**
     * 用于被统计模块所调用的一些controller
     * 1 根据用户表的注册日期信息 查询并统计出在某一天网站的注册人数
     */

    // 查询某一天的注册人数
    @GetMapping("countRegister/{day}")
    public R countRegister(@PathVariable String day) {
        Integer count = memberService.countRegisterDay(day);
        return R.ok().data("countRegister",count);
    }
}

